package cn.lg.soar.core.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 参数hash 方式实现幂等性（黑名单法）
 * 优点：在一定时间内能防恶意重放攻击
 * 缺点：配置麻烦，后端需反射参数并hash生成key，所以性能有损耗
 * 请求处理前根据参数生成信息摘要，如果此信息摘要不存在则保存摘要并处理请求，否则不处理
 * @author luguoxiang
 * @date 2022/6/27
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface IdempotentByParam {

    /**
     * 参数值el表达式，支持多个使用”separator“属性提供的字符隔开
     * @return
     */
    String value();

    /**
     * 参数分隔符
     * @return
     */
    String separator() default ",";

    /**
     * 摘要缓存时间（多长时间内不可再次提交）
     * @return
     */
    int expire() default 300_000;

    /**
     * 对象类参数属性名单（白名单、黑名单）
     * @return
     */
    String[] properties() default {};

    /**
     * 名单模式（白名单、黑名单）
     * @return
     */
    Mode mode() default Mode.EXCLUDE;

    /**
     * 提示信息
     * @return
     */
    String message() default "请勿重复提交";

    enum Mode {
        /**
         * 排除指定属性（黑名单）
         */
        EXCLUDE,

        /**
         * 包含指定属性（白名单）
         */
        CONTAIN
    }

}
